﻿#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>


//找出100~200之间的素数，并打印在屏幕上。
//注：素数⼜称质数，只能被1和本⾝整除的数字
// 方法一
//int main()
//{
//	int i = 0;
//	
//	for (i = 100; i <= 200; i++)
//	{
//		int flag = 1;//假设i是素数
//		//每一次循环进来都会产生一个数字
//		//判断i是否是素数
//		//产生2~i-1之间的数字去试除1
//		int j = 0;
//		for (j = 2; j <= i - 1; j++)
//		{
//			if (i % j == 0)
//			{
//				flag = 0;
//				break;
//			}
//		}
//		if (flag == 1)
//		{
//			printf("%d 是素数\n", i);
//		}
//	}
//	return 0;
//}


//方法二
//sqrt 是一个库函数，计算平方根
//#include <math.h>
//int main()
//{
//	int i = 0;
//	int count = 0;
//	for (i = 101; i <= 200; i += 2)
//	{
//		int flag = 1;//假设i是素数
//		//每一次循环进来都会产生一个数字
//		//判断i是否是素数
//		//产生2~i-1之间的数字去试除1
//		int j = 0;
//		for (j = 2; j <= sqrt(i); j++)
//		{
//			if (i % j == 0)
//			{
//				flag = 0;
//				break;
//			}
//		}
//		if (flag == 1)
//		{
//			count++;
//			printf("%d 是素数\n", i);
//		}
//	}
//	printf("\count = %d\n", count);
//	return 0;
//}


//goto 语句可以实现在同⼀个函数内跳转到设置好的标号处
//int main()
//{
//
//	printf("hehe\n");
//
//	if (1)
//		goto end;
//
//	printf("hahan\n");
//
//end:
//	printf("end\n");
//
//
//	return 0;
//}


//goto 语句如果使⽤的不当，就会导致在函数内部随意乱跳转，打乱程序的执⾏流程，所以我们的建议是能不⽤尽量不去使⽤；
//但是 goto 语句也不是⼀⽆是处，在多层循环的代码中，如果想快速跳出使⽤ goto 就⾮常的⽅便了。
//int main()
//{
//again:
//	printf("hehe\n");
//
//	goto again;
//
//	return 0;
//}


//关机程序
//1.程序运行起来的时候，就开始倒计时关机
//2.但是如果你输入：我是猪，就取消关机
//shutdown  -s：关机   -t：设计时间关机 秒
//shutdown -s -t 60      倒计时60秒关机
//shutdown -a  取消关机
//system -- 库函数，可以执行系统命令，包含头文件<stdlib.h>
//两个字符串比较相等的时候不能使用==，应该使用strcmp
//#include <stdlib.h>
//#include <string.h>
//int main()
//{
//	char input[20] = { 0 };
//	system("shutdown -s -t 60");
//again:
//	printf("请注意，你的电脑将在1分钟内关机，如果输入：我是猪，就取消关机\n");
//	scanf("%s", &input);
//	//判断input中存放的是不是“我是猪”
//	if (strcmp("我是猪", input) == 0)
//		system("shutdown -a");
//	else
//	{
//		goto again;
//	}
//
//	return 0;
//}


//#include <stdlib.h>
//#include <string.h>
//int main()
//{
//	char input[20] = { 0 };
//	system("shutdown -s -t 60");
//	
//	while (1)
//	{
//		printf("请注意，你的电脑将在1分钟内关机，如果输入：我是猪，就取消关机\n");
//		scanf("%s", &input);
//		//判断input中存放的是不是“我是猪”
//		if (strcmp("我是猪", input) == 0)
//		{
//			system("shutdown -a");
//			break;
//		}
//	}
//	
//	return 0;
//}



//写⼀个猜数字游戏
//游戏要求：
//1. 电脑⾃动⽣成1~100的随机数
//2. 玩家猜数字，猜数字的过程中，根据猜测数据的⼤⼩给出⼤了或⼩了的反馈，直到猜对，游戏结束
//C语言提供了⼀个函数叫rand，这函数是可以⽣成随机数的
//rand函数会返回⼀个伪随机数，这个随机数的范围是在0~RAND_MAX之间
//这个RAND_MAX的⼤⼩是依赖编译器上实现的，但是⼤部分编译器上是32767。
//rand函数的使⽤需要包含⼀个头⽂件是：stdlib.h
//我们可以看到虽然⼀次运⾏中产⽣的5个数字是相对随机的，但是下⼀次运⾏程序⽣成的结果和上⼀次⼀模⼀样，这就说明有点问题。
//如果再深⼊了解⼀下，我们就不难发现，其实rand函数⽣成的随机数是伪随机的，伪随机数不是真正的随机数，
//是通过某种算法⽣成的随机数。真正的随机数的是⽆法预测下⼀个值是多少的。
//⽽rand函数是对⼀个叫“种⼦”的基准值进⾏运算⽣成的随机数。
//之所以前⾯每次运⾏程序产⽣的随机数序列是⼀样的，那是因为rand函数⽣成随机数的默认种⼦是1。
//如果要⽣成不同的随机数，就要让种⼦是变化的。
//int main()
//{
//
//	printf("%d\n", rand());
//	printf("%d\n", rand());
//	printf("%d\n", rand());
//	printf("%d\n", rand());
//	printf("%d\n", rand());
//
//	return 0;
//}


//C语⾔中⼜提供了⼀个函数叫srand，⽤来初始化随机数的⽣成器的
//程序中在调⽤rand函数之前先调⽤srand函数，通过srand函数的参数seed来设置rand函数⽣成随机数的时候的种⼦，
//只要种⼦在变化，每次⽣成的随机数序列也就变化起来了。
//那也就是说给srand的种⼦是如果是随机的，rand就能⽣成随机数；在⽣成随机数的时候⼜需要⼀个随机数，这就⽭盾了。
//int main()
//{
//	srand(2);
//	printf("%d\n", rand());
//	printf("%d\n", rand());
//	printf("%d\n", rand());
//	printf("%d\n", rand());
//	printf("%d\n", rand());
//
//	return 0;
//}


//在程序中我们⼀般是使⽤程序运⾏的时间作为种⼦的，因为时间时刻在发⽣变化的。
//在C语⾔中有⼀个函数叫time，就可以获得这个时间
//time函数会返回当前的⽇历时间，其实返回的是1970年1⽉1⽇0时0分0秒到现在程序运⾏时间之间的差值，单位是秒。
//返回的类型是time_t类型的，time_t类型本质上其实就是32位或者64位的整型类型。
//time函数的参数timer如果是⾮NULL的指针的话，函数也会将这个返回的差值放在timer指向的内存中带回去。
//如果timer是NULL，就只返回这个时间的差值。time函数返回的这个时间差也被叫做：时间戳。
//time函数的时候需要包含头⽂件：time.h
//#include <stdlib.h>
//#include <time.h>
//int main()
//{
//	//设置随机数的生成起点（种子）
//	srand((unsigned int)time(NULL));
//
//	int i = 0;
//	for (i = 1; i <= 100; i++)
//	{
//		printf("%d\n", rand()%100+1);
//	}
//	
//	return 0;
//}



//猜数字游戏
////void表示函数不返回任何参数值
//void menu()
//{
//	printf("**********************************\n");
//	printf("**************1.play**************\n");
//	printf("**************2.exit**************\n");
//	printf("**********************************\n");
//	
//}
//
//void game()
//{
//	//游戏的逻辑
//	//1.生成随机数
//	int r = rand() % 100 + 1;
//
//	//2.猜数字
//	int guess = 0;
//
//	//限制猜数字次数
//	int count = 5;
//
//	while (count)
//	{
//		printf("还有%d次机会!\n", count);
//		printf("请猜数字：");
//		scanf("%d", &guess);
//		if (guess > r)
//		{
//			printf("猜大了\n");
//		}
//			
//		else if (guess < r)
//		{
//			printf("猜小了\n");
//		}
//			
//		else
//		{
//			printf("恭喜你，猜对了！！！\n");
//			break;
//		}
//		count--;
//	}
//	if (count == 0)
//	{
//		printf("用完了所有机会，猜数字失败！\n");
//		printf("正确的值是：%d\n",r);
//	}
//}
//
//int main()
//{
//	int input = 0;
//
//	//设置随机数的生成起点，整个工程中只用调用一次就可以了
//	srand((unsigned int)time(NULL));
//
//	do
//	{
//		//打印菜单
//		menu();
//		
//
//		//选择
//		printf("请选择（1/0）：");
//		scanf("%d", &input);
//		switch (input)
//		{
//		case 1:
//			game();
//			break;
//		case 0:
//			printf("退出游戏\n");
//			break;
//		default:
//			printf("选择错误，请重新选择！！！\n");
//			break;
//		}
//	} while (input);
//
//	return 0;
//}





//数组
//数组是⼀组相同类型元素的集合
//为了能够存放多个相同类型的数据，就有了数组

//一维数组的创建和初始化
//int main()
//{
//	//int math[20];//数组有20个元素，每个元素的类型是int
//	//char ch[5];
//	//double arr[6];
//
//	//有时候，数组在创建的时候，我们需要给定⼀些初始值，这种就称为初始化
//	int math[20] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 };
//	int math2[20] = { 0,1,2,3,4,5 };//不完全初始化，剩下的元素默认初始化为0
//
//	char ch[5] = { 'a','b' };
//	char ch2[5] = "abc";
//	double arr[6] = { 0.0 };
//
//	return 0;
//}


//数组也是有类型的，数组算是⼀种⾃定义类型，去掉数组名留下的就是数组的类型
//int main()
//{
//	int a = 10;
//	char ch = 'w';
//	double d = 0.0;
//
//	int arr[10] = { 0 };
//
//	//数组有没有类型
//	//数组的类型是什么？
//	//数组的元素类型是int
//	//数组的类型 - int[10]
//
//	int arr2[5];
//
//	return 0;
//}



//使用一维数组
//C语言规定数组是有下标的，下标是从0开始的，假设数组有n个元素，最后⼀个元素的下标是n - 1
//在C语⾔中数组的访问提供了⼀个操作符[] ，这个操作符叫：下标引⽤操作符。
//有了下标访问操作符，我们就可以轻松的访问到数组的元素了
//⽐如我们访问下标为7的元素，我们就可以使⽤ arr[7] ，想要访问下标是3的元素，就可以使⽤ arr[3]
//int main()
//{
//	//当对数组进行初始化的时候，数组的大小可以省略，编译器会根据数组的初始化内容，自动计算数组元素的个数
//
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	//10 是指定数组的元素个数的
//
//	printf("%d\n", arr[5]);//这里的5是数组元素的下标
//	printf("%d\n", arr[9]);
//
//	return 0;
//}


//int main()
//{
//
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//
//	//0~9
//	int i = 0;
//
//	//方法一
//	/*for (i = 0; i < 10; i++)
//	{
//		printf("%d ", arr[i]);
//	}*/
//
//	//方法二
//	//while (i < 10)
//	//{
//	//	printf("%d ", arr[i]);
//	//	i++;
//	//}
//
//	//return 0;
//
//	//给数组中输入10个值
//	for (i = 0; i < 10; i++)
//	{
//		scanf("%d", &arr[i]);
//	}
//
//	//打印数组的内容
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//}




//一维数组在内存中的存储
//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		printf("&arr[%d] = %p\n", i, &arr[i]);//&：取地址操作符，取出变量在内存中的地址
//	}
//
//	return 0;
//}



//sizeof计算数组元素个数
//sizeof 中C语⾔是⼀个关键字，是可以计算类型或者变量⼤⼩的，其实 sizeof 也可以计算数组的⼤⼩。
//单位是字节
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int a = 0;
	printf("%d\n", sizeof(a));
	printf("%d\n", sizeof(int));
	printf("%d\n", sizeof(arr));//计算的是数组的大小，单位是字节，40个字节

	int sz = sizeof(arr) / sizeof(arr[0]);//计算数组元素的个数
	printf("数组元素的个数为%d\n", sz);

	int i = 0;
	for (i = 0; i <sz ; i++)
	{
		printf("%d ", arr[i]);
	}

	return 0;
}